package com.chb.controller.sys;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.chb.entity.sys.Role;
import com.chb.entity.sys.User;
import com.chb.service.sys.RoleService;
import com.chb.service.sys.UserService;
import com.chb.utils.StringUtil;

/**
 * 
* @Description: 作用:{用户controller} 
* @author  彬哥  
* @date 2018年3月1日 下午2:36:29 
* @version V1.0
 */
@Controller
@RequestMapping("/user")
public class UserController {
	
		@Resource
		private UserService userService;
		@Resource
		private RoleService roleService;
	
		/**
		 * 
		* @Description: 作用:{用户登录判断} 
		* @author  彬哥  
		* @date 2018年3月1日 下午2:42:45 
		* @version V1.0
		* //@Valid 是 spring data 的验证 框架
		 */
		@ResponseBody
		@RequestMapping("/login")
		public Map<String,Object> login(String imageCode,@Valid User user,BindingResult bindResult,HttpSession session)
		{
			Map<String,Object> map=new HashMap<>();
			if(StringUtil.isEmpty(imageCode))
			{
				
				map.put("success", false);//返回信息的封装
				map.put("error","请输入验证码!");
				return map;
			}
			if(!session.getAttribute("checkcode").equals(imageCode))
			{
				map.put("success", false); 
				map.put("error","验证码输入错误!");
				return map;
			}
			//用户名 密码 验证
			if(bindResult.hasErrors()) //如果有错误信息  就是扫描 实体类上面的注解
			{
				map.put("success", false); 
				map.put("error",bindResult.getFieldError().getDefaultMessage());
				return map;
			}
			//都通过了，获得主体
			Subject subject=SecurityUtils.getSubject();
			//封装token
			UsernamePasswordToken token=new UsernamePasswordToken(user.getUserName(),user.getPassword());
			try {
				subject.login(token);//这里进入自定义的realm里面去，如果有异常就说明 用户名 和密码 是错误的
				String userName=(String)SecurityUtils.getSubject().getPrincipal();
				User currentUser=this.userService.findByUserName(userName);
				session.setAttribute("currentUser",currentUser);
				List<Role> roleList=this.roleService.findRoleByUserId(currentUser.getId());
				map.put("roleList", roleList);
				map.put("roleSize", roleList.size());
				map.put("success", "登陆成功");
				return map;
				
			} catch (Exception e) {
				e.printStackTrace();
				map.put("success", false); 
				map.put("error","用户名或者密码错误!");
				return map;
			}
			
		}
		
		/**
		 * 
		* @Description: 作用:{保存角色信息} 
		* @author  彬哥  
		* @date 2018年3月1日 下午11:09:21 
		* @version V1.0
		 */
		@ResponseBody
		@RequestMapping("/saveRole")
		public Map<String,Object> saveRole(Integer roleId,HttpSession session)
		{
			Map<String,Object> map=new HashMap<>();
			Role currentRole=this.roleService.findOne(roleId);
			session.setAttribute("currentRole",currentRole);
			map.put("success", true);
			return map;
		}
		
}
